package br.com.yurikimo.ykkit;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
//import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class YKDataBaseHelper extends SQLiteOpenHelper{
	 
  //The Android's default system path of your application database.
  private static String DB_PATH = "/data/data/com.preformed/databases/";

  private static String DB_NAME = "preformed.db";

  private static SQLiteDatabase dataBase;

  private final Context context;

  /**
   * Constructor
   * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
   * @param context
   */
  public YKDataBaseHelper() {
  	super(YKDirector.getActivity(), DB_NAME, null, 1);
     this.context = YKDirector.getActivity();
  }

/**
   * Creates a empty database on the system and rewrites it with your own database.
   * */
  public void createDataBase(){

  	boolean dbExist = false;//checkDataBase();

  	if(dbExist){
  		//do nothing - database already exist
  	}
  	else{
			//By calling this method and empty database will be created into the default system path
      //of your application so we are gonna be able to overwrite that database with our database.
    	this.getReadableDatabase();

    	try {
    		copyDataBase();
  		} 
      catch (IOException exception) {
      	exception.printStackTrace();
      }
  	}
  }

  /**
   * Check if the database already exist to avoid re-copying the file each time you open the application.
   * @return true if it exists, false if it doesn't
   */
//  private boolean checkDataBase(){
//
//  	SQLiteDatabase checkDB = null;
//
//  	try{
//  		String myPath = DB_PATH + DB_NAME;
//
//  		checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
//
//  	}catch(SQLiteException sqLiteException){
//  		sqLiteException.printStackTrace();
//  	}
//
//  	if(checkDB != null){
//
//  		checkDB.close();
//
//  	}
//
//  	return checkDB != null ? true : false;
//  }

  /**
   * Copies your database from your local assets-folder to the just created empty database in the
   * system folder, from where it can be accessed and handled.
   * This is done by transfering bytestream.
   * */
  private void copyDataBase() throws IOException{
  	File file = new File(DB_PATH + DB_NAME);
  	
  	boolean deleted = file.delete();

  	System.out.println(deleted);
  	
  	//Open your local db as the input stream
  	InputStream myInput = context.getAssets().open(DB_NAME);

  	// Path to the just created empty db
  	String outFileName = DB_PATH + DB_NAME;

  	//Open the empty db as the output stream
  	OutputStream myOutput = new FileOutputStream(outFileName);

  	//transfer bytes from the inputfile to the outputfile
  	byte[] buffer = new byte[1024];
  	int length;
  	while ((length = myInput.read(buffer))>0){
  		myOutput.write(buffer, 0, length);
  	}

  	//Close the streams
  	myOutput.flush();
  	myOutput.close();
  	myInput.close();
  }

  public void openDataBase() throws SQLException{
  	createDataBase();
  	//Open the database
    String myPath = DB_PATH + DB_NAME;
  	dataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
  }

  @Override
	public synchronized void close() {
	    if(dataBase != null)
		    dataBase.close();
	
	    super.close();
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
	
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	
	}

	public List<ArrayList<String>> getDataFromTable(boolean distinct, String table, String collumns[], String where, String orderBy){
		List<ArrayList<String>> lstTable = new ArrayList<ArrayList<String>>();
	    
	    Cursor cursor = null;
	    
	    try{
	    	         //dataBase.query(distinct, table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
	    	         
		    cursor = dataBase.query(distinct, table, collumns, where, null, null, null, orderBy, null);
		    
		    if (cursor.moveToFirst()) {
		       do {
		      	 ArrayList<String> lstRow = new ArrayList<String>();
		      	 
		      	 for (int i = 0; i < cursor.getColumnCount(); i++){
		      		 lstRow.add(cursor.getString(i));
		      	 }
		         
		      	 lstTable.add(lstRow);
		       } while (cursor.moveToNext());
		    }
		    
		    if (cursor != null && !cursor.isClosed()) {
		       cursor.close();
		    }
	    }
	    catch(Exception exception){
	    	exception.printStackTrace();
	    }
	    
	    return lstTable;
	}
	
	public List<ArrayList<String>> getDataFromTable(String table, String collumns[], String where, String orderBy){
		return getDataFromTable(false, table, collumns, where, orderBy);
	}
}